/*==============================================================================
**                                  LINDBOARD
**                      Proprietary - Copyright (C) 2014
**                      www.facebook.com/lindboard
**------------------------------------------------------------------------------
** Supported MCUs      : MCU STM32F103
** Supported Compilers : Compiler independent
**-----------------------------------------------------------------------------
** File name         : output.c
**
** Module name       : Output 
**
** Requirement specification : STM32 Usermanual and OUTPUT.pdf Developmentboard
**
** Summary: Output controller 
**
**= History ====================================================================
** 01.00  20/02/2014  Cuong Chu
** - Creation
**        17/7/2017   Cuong Chu
** - once call clock supply by function IOEnableClock
** - remove some ways to configure GPIO function by replacing CNF and MODE 
==============================================================================*/
/******************************************************************************/
/* INCLUSIONS                                                                 */
/******************************************************************************/
#include "output.h"

/******************************************************************************/
/* DEFINATION OF CONST                                                        */
/******************************************************************************/
#define RCC_GPIOA                                 2                    
#define RCC_GPIOB                                 3
#define RCC_GPIOC                                 4
#define RCC_GPIOD                                 5
#define RCC_GPIOE                                 6
/******************************************************************************/
/* DEFINATION OF INTERNNAL VARIABLE OF MODULE                                 */
/******************************************************************************/
static const uint8_t PinIndex[] =
{
   2 , /* P1  */
   3 , /* P2  */
   4 , /* P3  */
   5 , /* P4  */
   6 , /* P5  */
   13, /* P6  */
   14, /* P7  */
   15, /* P8  */
   0 , /* P9  */
   1 , /* P10 */
   2 , /* P11 */
   3 , /* P12 */
   0 , /* P13 */
   1 , /* P14 */
   2 , /* P15 */
   3 , /* P16 */
   4 , /* P17 */
   5 , /* P18 */
   6 , /* P19 */
   7 , /* P20 */
   4 , /* P21 */
   5 , /* P22 */
   0 , /* P23 */
   1 , /* P24 */
   7 , /* P25 */
   8 , /* P26 */
   9 , /* P27 */
   10, /* P28 */
   11, /* P29 */
   12, /* P30 */
   13, /* P31 */
   14, /* P32 */
   15, /* P33 */
   10, /* P34 */
   11, /* P35 */
   12, /* P36 */
   13, /* P37 */
   14, /* P38 */
   15, /* P39 */
   8 , /* P40 */
   9 , /* P41 */
   10, /* P42 */
   11, /* P43 */
   12, /* P44 */
   13, /* P45 */
   14, /* P46 */
   15, /* P47 */
   6 , /* P48 */
   7 , /* P49 */
   8 , /* P50 */
   9 , /* P51 */
   8 , /* P52 */
   9 , /* P53 */
   10, /* P54 */
   11, /* P55 */
   12, /* P56 */
   10, /* P57 */
   11, /* P58 */
   12, /* P59 */
   0 , /* P60 */
   1 , /* P61 */
   2 , /* P62 */
   3 , /* P63 */
   4 , /* P64 */
   8 , /* LCD D0 */
   9 , /* LCD D1 */
   10, /* LCD D2 */
   11, /* LCD D3 */
   12, /* LCD RS */
   13, /* LCD RW */
   14, /* LCD EN */
   3,  /* Keypad R0 */
   2,  /* Keypad R1 */
   1,  /* Keypad R2 */
   0,  /* Keypad R3 */
   2,  /* LED OK */
   3   /* LED NG */
}; 
static GPIO_TypeDef* GPIOx[] =
{
  GPIOE , /* P1  */
  GPIOE , /* P2  */
  GPIOE , /* P3  */
  GPIOE , /* P4  */
  GPIOE , /* P5  */
  GPIOC , /* P6  */
  GPIOC , /* P7  */
  GPIOC , /* P8  */
  GPIOC , /* P9  */
  GPIOC , /* P10 */
  GPIOC , /* P11 */
  GPIOC , /* P12 */
  GPIOA , /* P13 */
  GPIOA , /* P14 */
  GPIOA , /* P15 */
  GPIOA , /* P16 */
  GPIOA , /* P17 */
  GPIOA , /* P18 */
  GPIOA , /* P19 */
  GPIOA , /* P20 */
  GPIOC , /* P21 */
  GPIOC , /* P22 */
  GPIOB , /* P23 */
  GPIOB , /* P24 */
  GPIOE , /* P25 */
  GPIOE , /* P26 */
  GPIOE , /* P27 */
  GPIOE , /* P28 */
  GPIOE , /* P29 */
  GPIOE , /* P30 */
  GPIOE , /* P31 */
  GPIOE , /* P32 */
  GPIOE , /* P33 */
  GPIOB , /* P34 */
  GPIOB , /* P35 */
  GPIOB , /* P36 */
  GPIOB , /* P37 */
  GPIOB , /* P38 */
  GPIOB , /* P39 */
  GPIOD , /* P40 */
  GPIOD , /* P41 */
  GPIOD , /* P42 */
  GPIOD , /* P43 */
  GPIOD , /* P44 */
  GPIOD , /* P45 */
  GPIOD , /* P46 */
  GPIOD , /* P47 */
  GPIOC , /* P48 */
  GPIOC , /* P49 */
  GPIOC , /* P50 */
  GPIOC , /* P51 */
  GPIOA , /* P52 */
  GPIOA , /* P53 */
  GPIOA , /* P54 */
  GPIOA , /* P55 */
  GPIOA , /* P56 */
  GPIOC , /* P57 */
  GPIOC , /* P58 */
  GPIOC , /* P59 */
  GPIOD , /* P60 */
  GPIOD , /* P61 */
  GPIOD , /* P62 */
  GPIOD , /* P63 */
  GPIOD , /* P64 */
  GPIOB , /* LCD D0 */
  GPIOB , /* LCD D1 */
  GPIOB , /* LCD D2 */
  GPIOB , /* LCD D3 */
  GPIOB , /* LCD RS */
  GPIOB , /* LCD RW */
  GPIOB , /* LCD EN */
  GPIOC , /* Keypad R0 */
  GPIOC , /* Keypad R1 */
  GPIOC , /* Keypad R2 */
  GPIOC , /* Keypad R3 */
  GPIOA , /* LED OK */
  GPIOA , /* LED NG */
}; 

/*****************************************************************************/
/* DEFINATION OF GLOBAL FUNCTION                                             */
/*****************************************************************************/
/******************************************************************************
** Function Name: OUTPUT_IOEnableClock(void)
** Description  : The function enbales clock for all GPIOs
** Parameter    : None
** Return       : None
** Note         : 
******************************************************************************/
void OUTPUT_IOEnableClock
(
  void
)
{
  /* enable GPIOA,GPIOB,GPIOC,GPIOD,GPIOE clock */
  RCC->APB2ENR |= 1UL << RCC_GPIOA;
  RCC->APB2ENR |= 1UL << RCC_GPIOB;
  RCC->APB2ENR |= 1UL << RCC_GPIOC;
  RCC->APB2ENR |= 1UL << RCC_GPIOD;
  RCC->APB2ENR |= 1UL << RCC_GPIOE;
}  
/******************************************************************************
** Function Name: OUTPUT_OutputInit(OUTPUT_OutputType channel)
** Description  : The function inits buzzer controller
** Parameter    : OUT_CH_1..., please refer to OUTPUT enum define
** Return       : None
** Note         : None
******************************************************************************/
void OUTPUT_OutputInit
(
  OUTPUT_OutputType channel
)
{

  /* check pin index */
  if(PinIndex[channel] < 8 )
  {
    /* config port output push pull */
    GPIOx[channel]->CRL  &= ~(3UL << (PinIndex[channel]*4+2) );
    /* mode speed 50MHZ */
    GPIOx[channel]->CRL   |= 3UL << PinIndex[channel]*4;
  }
  else
  {
    /* config port output push pull */
    GPIOx[channel]->CRH   &= ~(3UL << ((PinIndex[channel]-8)*4+2) );
    /* mode speed 50MHZ */
    GPIOx[channel]->CRH   |= 3UL << (PinIndex[channel]-8)*4;
  }
}
/******************************************************************************
** Function Name: OUTPUT_OutputSetLogic(OUTPUT_OutputType channel, 
**                                       OUTPUT_LogicLevel level)
** Description  : The function sets login selected on pin output channel
** Parameter    : None
** Return       : None
** Note         : 
******************************************************************************/
void OUTPUT_OutputSetLogic
(
  OUTPUT_OutputType channel, 
  COMST32_LogicLevel level
)
{
  if(level==STD_LOW)
  {
    GPIOx[channel]->BSRR |= 1UL << (PinIndex[channel]+16);
  }
  else
  {
    GPIOx[channel]->BSRR |= 1UL << PinIndex[channel];
  }
}
/*****************************************************************************/
/* End Of File Copyright LINDBOARD 2014                                      */
/*****************************************************************************/
